/**
 * 
 */
package com.nari.interfaces.handler;

import com.nari.interfaces.decipher.gprs.vo.UploadMeterDataSeal;

/**
 * 服务端数据同步处理
 * @author Xiaopeng
 * @date 2014-3-31
 */
public class ServerMeterDataSealSynchronous {
	
	/**
	 * 重置帧数据
	 * @param meterDataSet
	 * @return
	 * @author Xiaopeng
	 * @date 2014-3-31
	 */
	public static UploadMeterDataSeal resetMeterDataSeal(UploadMeterDataSeal meterDataSeal) {
		if(meterDataSeal == null) {
			meterDataSeal = new UploadMeterDataSeal();
			//设置总帧数，以支持数据续传
			meterDataSeal.setTotalFrames(1);
		}
		//清空抄表数据
		meterDataSeal.clearDataSeal();
		//重置当前帧数
		meterDataSeal.setCurrFrameIndex(0);
		//重置下一帧数
		meterDataSeal.setRequestFrameIndex(1);
		return meterDataSeal;
	}
	
	/**
	 * 比较帧封装数据，并进行数据同步
	 * @param aimDataSeal 默认缓存数据
	 * @param compareNextDataSeal 默认的下一帧需要同步的数据
	 * @return 
	 * @author Xiaopeng 
	 * @date 2014-3-31
	 * @update 2015-2-9
	 */
	public static UploadMeterDataSeal synchroMeterDataSeal(UploadMeterDataSeal aimDataSeal, 
			UploadMeterDataSeal compareNextDataSeal) {
		//确定任务批次为同一批次，并进行数据同步
		if(aimDataSeal!=null && compareNextDataSeal!=null 
				&& aimDataSeal.getConcentratorNo().equals(compareNextDataSeal.getConcentratorNo()) 
						&& aimDataSeal.getRecordTime().equals(compareNextDataSeal.getRecordTime())) {
			//被比较数据是目标数据的下一帧，则同步数据
			if(aimDataSeal.getCurrFrameIndex()+1==compareNextDataSeal.getCurrFrameIndex()) {
				//同步热表数据
				aimDataSeal.getAssignMeterDatas().addAll(compareNextDataSeal.getAssignMeterDatas());
				aimDataSeal.getHeatMeterDatas().addAll(compareNextDataSeal.getHeatMeterDatas());
				aimDataSeal.getTempPointDatas().addAll(compareNextDataSeal.getTempPointDatas());
				//设置目标数据当前帧数
				aimDataSeal.setCurrFrameIndex(compareNextDataSeal.getCurrFrameIndex());
				//设置目标数据总帧数
				aimDataSeal.setTotalFrames(compareNextDataSeal.getTotalFrames());
				//设置目标数据下一帧数
				aimDataSeal.setRequestFrameIndex(aimDataSeal.getCurrFrameIndex() + 1);
			} else {
				//非顺序的帧数错位，则按目标数据续传数据
				aimDataSeal.setRequestFrameIndex(aimDataSeal.getCurrFrameIndex() + 1);
			}
		}
		//若目标数据为空，则视比较数据的状态，确定是否同步数据
		boolean ifReturnModify = false;
		if(aimDataSeal == null) {
			aimDataSeal = new UploadMeterDataSeal();
			//若比较数据为第一帧数据，则返回比较数据
			if(compareNextDataSeal!=null && compareNextDataSeal.getCurrFrameIndex()==1) {
				aimDataSeal = compareNextDataSeal;
				//返回对象发生转移，避免审计日志重复加载
				ifReturnModify = true;
			}
		}
		//记录解析器异常日志
		if(compareNextDataSeal!=null && !ifReturnModify) {
			aimDataSeal.getFrameDecoderLogList().addAll(compareNextDataSeal.getFrameDecoderLogList());
		}
		return aimDataSeal;
	}
	
}
